home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
exec31.arc
/
LIESMICH.DOC
< prev
next >
Wrap
Text File
|
1991-08-25
|
18KB
|
410 lines
Eine EXEC Funktion mit Speicherauslagerung
Version 3.1, Freigegeben 91-08-20
Public Domain Software von
Thomas Wagner
Ferrari electronic GmbH
Dieses Archiv enthält die Quellen für eine 'EXEC'-Funktion die den
Aufruf externer Programme erlaubt, wobei der Programmspeicher
optional auf EMS, XMS, oder Datei ausgelagert wird. Bei Auslagerung
des Speichers werden nur noch wenige K des Hauptspeichers belegt
während das externe Programm ausgeführt wird. Der Code/Daten-Bereich
beträgt etwa 1k, der benötigte Speicherplatz ist abhängig von der
Speicherfragmentierung, sowie besonders von der Größe des
Umgebungsvariablenblocks. Üblicherweise werden zwischen 2K und 7K
belegt.
Die Routinen sind kompatibel mit
Turbo C (Versionen 1.x, 2.x, sowie C++ 1.0)
Borland C++ (Version 2.0),
Microsoft C (Versionen 5.1 und 6.0),
Watcom C (Version 8.0),
Turbo Pascal (Versionen 4.x und 5.x, Version 6.x nicht getestet).
EMS (LIM 3.0 und spätere Versionen) oder XMS werden benutzt sofern
ausreichend Platz zur Verfügung steht. Wenn nicht, wird eine
temporäre Plattendatei angelegt. Diese Datei wird in dem durch die
Umgebungsvariablen TEMP= oder TMP= gegebenen Pfad angelegt. Ist kein
solcher Pfad angegeben, wird der aktuelle Pfad benutzt.
Aufruf und Parameterversorgung sind in der Datei "exec.h" (C) bzw.
"exec.pas" (Pascal) detailliert dokumentiert.
Das allgemeine Format ist
retcode = do_exec (Name des auszuführenden Programms,
Programm-Parameter und Redirection String,
Spawn-Optionen,
Benötigter Speicher (0xffff lagert stets aus, 0 nie),
Umgebungsvariablen-Zeiger/Flag)
zum Beispiel:
rc = do_exec ("cl", "-c -Od exec.c >&errout", USE_ALL, 0xffff, NULL);
oder, für Pascal:
rc := do_exec ('tpc', '/$D+ exec >&errout', USE_ALL, $ffff, false);
Redirection für Standard Input, Standard Output, und Standard Error
wird optional behandelt indem der Parameter-String nach den folgenden
Kombinationen durchsucht wird:
stdin: <file
stdout: >file oder >>file zum Anfügen
stderr: >&file oder >&>file zum Anfügen
Redirection wird standardmäßig unterstützt. Um sie auszuschalten,
müssen Sie die Definitionen sowohl in spawn.asm als auch in
exec.c/exec.pas ändern.
Wenn das auszuführende Kommando eine Batch-Datei ist, wird
automatisch der Kommando-Prozessor aufgerufen. Der Kommandoprozessor
wird auch aufgerufen wenn das Kommando leer ist. Dabei wird die
COMSPEC-Umgebungsvariable benutzt um den Kommandoprozessor zu finden,
zusätzliche Parameter in der COMSPEC-Zeile werden in die
Kommandoparameter eingefügt.
Zum Beispiel:
Es sei COMSPEC=C:\DOS\COMMAND.COM /E:960
PATH=C:\DOS;C:\CMD
Datei B.BAT existiert in C:\CMD
do_exec wird aufgerufen mit ('b', 'eins zwei >out', ...)
Dann ist das aufgerufene Kommando
C:\DOS\COMMAND.COM
mit dem Parameter-String
/E:720 /C C:\CMD\B.BAT eins zwei
und Standard Output wird umgeleitet auf die Datei 'out'.
INHALT
======
Dieses Archiv enthält die folgenden Dateien:
LIESMICH.DOC Diese Datei
README.DOC Englische Version dieser Datei
GETLANG.EXE Ein Hilfsprogramm zur Extraktion einer ein-
sprachigen Version aus der zweisprachigen
Quelle.
Alle C- und Assembler-Quellen (die Pascal-Quellen
leider nur teilweise) sind sowohl in Deutsch als
auch in Englisch dokumentiert, was die Quellen
schwer lesbar macht. Für bessere Lesbarkeit
können Sie mit GETLANG eine der Sprachen
eliminieren.
Benutzung: GETLANG Sprache Compiler <Eingabe >Ausgabe
wobei Sprache 'E' für Englisch oder 'D' für Deutsch
Compiler 'C' für C Dateien, 'A' für Assembler,
'P' für Pascal.
Beispiele: GETLANG d a <spawn.asm >spawnd.asm
GETLANG d c <extest.c >extestd.c
DEUTSCH.BAT Batch-File zur Ausführung von GETLANG für alle
Quelldateien, deutsche Version
ENGLISH.BAT Batch-File zur Ausführung von GETLANG für alle
Quelldateien, englische Version
SPAWN.ASM Die Hauptfunktion für exec.
Diese Datei ist für die C und Pascal Versionen gleich.
Für Benutzung mit Turbo Pascal muß mit dem Turbo-Assembler
assembliert werden. Die C Version kann mit TASM (geben Sie
/JMASM51 an) oder MASM 5.1 übersetzt werden.
Assemblieren mit:
tasm /DPASCAL spawn,spawnp; Für Turbo Pascal, near calls
tasm /DPASCAL /DFARCALL spawn,spawnp;
Für Turbo Pascal, far calls
?asm spawn; Für C (Default small model)
?asm /DMODL=xxx spawn; For C (model 'xxx')
Beispiel:
masm /DMODL=large spawn; Large model C
tasm /DMODL=medium /JMASM51 spawn; Medium model C
SPAWNP.OBJ SPAWN assembliert für Pascal, near calls
SPAWNCS.OBJ SPAWN assembliert für C (small model)
SPAWNCL.OBJ SPAWN assembliert für C (large model)
Die C Dateien wurden mit dem /MX-Schalter übersetzt um
Groß-/Kleinschreibung beim Linken zu berücksichtigen.
Hinweis für Turbo Pascal: Sie können die "near call" Version
von SPAWN auch dann nutzen wenn Sie mit "force far calls"
kompilieren, indem Sie die "external"-Definitionen von
do_spawn und prep_swap in Datei exec.pas in {$F-} und {$F+}
einschließen.
Um Konfusion bei der Verwendung mehrerer Compiler zu
vermeiden, wurde das Pascal-Object "spawnp.obj" benannt.
CHECKPAT.ASM Hilfsfunktion zur Prüfung und Auflösung eines Pfades
Diese Datei ist für die C und Pascal Versionen gleich.
Für Benutzung mit Turbo Pascal muß mit dem Turbo-Assembler
assembliert werden. Die C Version kann mit TASM (geben Sie
/JMASM51 an) oder MASM 5.1 übersetzt werden.
Assemblieren mit:
tasm /DPASCAL checkpat,checkpap; Für Turbo Pascal, near calls
tasm /DPASCAL /DFARCALL checkpat,checkpap;
Für Turbo Pascal, far calls
?asm checkpat; Für C (Default small model)
?asm /DMODL=xxx checkpat; Für C (model 'xxx')
Beispiel:
masm /DMODL=large checkpat; Large model C
tasm /DMODL=medium /JMASM51 checkpat; Medium model C
CHECKPAP.OBJ CHECKPAT assembliert für Pascal, far calls
CHECKPCS.OBJ CHECKPAT assembliert für C (small model)
CHECKPCL.OBJ CHECKPAT assembliert für C (large model)
CHECKPAT.PAS Einbindungs-Unit für checkpat (Nur Pascal)
Die C Dateien wurden mit dem /MX-Schalter übersetzt um
Groß-/Kleinschreibung beim Linken zu berücksichtigen.
Die Pascal-Version muß mit dem FARCALL-Schalter assembliert
werden wenn Sie sie mit der Einbindungs-Unit CHECKPAT.PAS
zusammen benutzen. Zumindest Turbo Pascal Version 5.5
verwendet offenbar stets einen Far Call wenn eine externe
Routine im Interface-Teil einer Unit definiert wird.
EXEC.PAS Interface Routinen und Dokumentation für Turbo Pascal
EXEC.C Interface Routinen für C
EXEC.H Interface Definitionen und Dokumentation für C
COMPAT.H MS-C/TC Kompatibilitäts-Definitionen für C
Diese Dateien bereiten die Parameter für die Hauptfunktion
vor und bearbeiten die Datei-Suche und Umgebungsvariablen.
EXTEST.C C Test-Programm für EXEC
EXTEST.PAS Turbo Pascal Test-Programm für EXEC
Das EXTEST Programm testet die Funktionalität der do_exec
Funktion. Es erwartet die Eingabe eines DOS-Kommandos und,
durch Komma getrennt, seiner Parameter. Die Eingabe einer
Leerzeile startet COMMAND.COM ohne Parameter.
MAKEPAS Make-Datei für Turbo Pascal (Borland Make)
MAKETC Make-Datei für Borland C++ (Borland Make)
MAKEMS Make-Datei für Microsoft C (MS NMAKE)
Die Turbo Pascal Version von EXEC.PAS enthält Ersatzfunktionen für
die Umgebungsvariablen-Zugriffsfunktionen 'envcount', 'envstr', und
'getenv', sowie eine zusätzliche Funktion 'putenv'. Diese Funktion
erlaubt Ihnen, zur Umgebung des gerufenen Programms Strings
hinzuzufügen. Die Definition ist
procedure putenv (envvar: string);
wobei 'envstr' einen String der Form 'ENVVAR=wert' enthält. Das '='
ist notwendig. Um einen Umgebungsvariablenstring zu löschen geben Sie
'ENVVAR=' an. Bitte nutzen Sie nur die Funktionen aus der EXEC Unit,
mischen Sie sie nicht mit Aufrufen der Funktionen der DOS Unit.
SUPPORT
=======
Diese Software ist "Public Domain", das heißt es gibt keinerlei
Einschränkungen bezüglich ihrer Nutzung, ob privat oder in
kommerziellen Produkten. Es ist weder eine Registrierungsgebühr zu
zahlen, noch sind zur Nutzung irgendwelche Lizenzen erforderlich.
Dies heißt allerdings auch, daß der Autor zu keiner Leistung
gegenüber dem Nutzer verpflichtet ist. Jegliche Ansprüche auf
Schadenersatz bei Fehlfunktionen sind ausgeschlossen. Sie haben die
Quellen, bitte prüfen Sie sie vor Nutzung.
Ich möchte auch um Verständnis bitten, daß ich nicht in der Lage bin,
kostenlose Programmierberatung zu erteilen, Spezialversionen für
exotische Compiler zu erstellen, oder neue Versionen dieses Programms
kostenlos zu versenden.
Fehlermeldungen, Verbesserungsvorschläge und ähnliches senden Sie
bitte an meine Firmen-Adresse:
Ferrari electronic GmbH
Thomas Wagner
Beusselstrasse 27
D-1000 Berlin 21
Telephon: (030) 396 50 21 (nur im äußersten Notfall)
Fax: (030) 396 80 20
BIX: twagner
UUCP: oeschi@netmbx.UUCP (attn: Thomas Wagner)
Ein eingeschränkter Support ist über BIX, das Teleconferencing System
von McGraw-Hill, möglich. Falls Sie Fragen oder Fehlermeldungen
haben, senden sie BIXmail an 'twagner'. Details über BIX finden Sie
in der Englischsprachigen Version dieser Dokumentation.
EINSCHRÄNKUNGEN
===============
Der "keine Rückkehr"-Modus von do_exec ist nur der Vollständigkeit
halber verfügbar. Er hat einige Nachteile gegenüber den
Standard-Funktionen der Compiler-Bibliotheken. Insbesondere werden
offene Dateien nicht abgeschlossen, und durch die Laufzeitbibliothek
belegte Interrupt-Vektoren werden nicht auf den DOS-Standardwert
zurückgesetzt. Wenn möglich, benutzen Sie für diesen Modus die
Standardfunktionen.
Das Assembler-Modul "spawn" darf nicht das erste Modul beim Linken
sein. Fügen Sie es in eine Bibliothek ein, oder geben Sie spawn.obj
als eine der letzten zu linkenden Dateien an. Das spawn-Modul
überschreibt etwa 1k am Anfang des Programmspeichers. Dieser Speicher
wird zwar gesichert, er darf aber nicht Teile des Moduls selbst
enthalten, da der Programmcode dabei zerstört würde. Die
do_exec-Funktion überprüft diese Bedingung, und kehrt mit einem
entsprechenden Fehlercode zurück falls der Code in Gefahr wäre.
Bei Aufruf von do_exec dürfen keine Interrupt-Handler installiert
sein. Dies schließt Handler für Control-C und Critical Errors ein.
Sofern Sie Interrupts bearbeiten wollen während Ihr Programm
ausgelagert ist, müssen Sie das spawn-Modul modifizieren, sodaß die
Handler in den residenten Teil übernommen werden.
Offene Dateien bleiben während der do_exec-Funktion geöffnet. Dies
reduziert die Zahl der möglichen offenen Dateien für das
Kind-Programm. Die Umgebungsvariable "C_FILE_INFO", die von einigen
C-Compilern bei Aufruf der Standard-Funktionen für spawn erzeugt
wird, wird nicht unterstützt. Wenn NO_INHERIT in spawn.asm gesetzt
ist (Standard), werden alle offenen Dateien außer den ersten fünf
Standard-Dateien vor dem Kindprozess "versteckt" und damit nicht
vererbt. Dies erlaubt dem Kindprozess, mehr Dateien zu öffnen, wobei
allerdings das Systemweite Limit (FILES= in config.sys) hoch genug
sein muß um alle offenen Dateien zu unterstützen.
Interne Kommandos (CD, DIR usw.) werden nicht automatisch bearbeitet.
Sie können diese ausführen indem Sie den Kommandointerpreter laden
(durch Übergabe eines leeren Strings für das auszuführende Programm).
Zum Beispiel:
(C) retcode = do_exec ("dir", "*.*", USE_ALL, 0xffff, environ);
if (retcode == RC_NOFILE)
retcode = do_exec ("", "/c dir *.*", USE_ALL, 0xffff, environ);
(P) retcode := do_exec ('dir', '*.*', USE_ALL, $ffff, true);
if (retcode = RC_NOFILE)
retcode := do_exec ('', '/c dir *.*', USE_ALL, $ffff, true);
HINWEISE
========
Die Funktion sollte mit DOS bis herunter zu Version 2.11 kompatibel
sein. Getestet wurde jedoch nur unter DOS 3.3, DOS 4.0, DOS 5.0, und
DR-DOS 5.0.
Kompatibilität zu Compiler-Versionen wurde nur getestet mit Borland
C++ 2.0, Microsoft C 6.0a, und Turbo Pascal 5.5. Auf andere Compiler
habe ich leider keinen Zugriff.
Wird ein Kommando aufgerufen das resident bleibt (TSR), zum Beispiel
PRINT oder Sidekick, ist eine Rückkehr in das rufende Programm nicht
möglich. Das Programm wird beendet, belegter Speicher in EMS/XMS wird
freigegeben, eine Auslagerungsdatei wird gelöscht.
Wenn der Programmspeicher aus mehreren DOS-Speicherblöcken besteht,
benutzt die Auslagerungsfunktion undokumentierte DOS-Interna.
Insbesondere werden Speicherkontrollblöcke direkt modifiziert. Dies
kann theoretisch zu Inkompatibilitäten mit späteren DOS-Versionen,
oder mit DOS-Clones oder Emulatoren führen. Im praktischen Betrieb
wurden bisher noch keine Probleme mit irgendwelchen DOS-Versionen,
einschließlich DOS 5.0 und der DR-DOS Versionen, festgestellt.
Wenn NO_INHERIT in spawn.asm gesetzt ist, werden einige
undokumentierte Felder im PSP benutzt und modifiziert. Auch dies
sollte mit allen DOS-Versionen und Clones funktionieren. Sollten Sie
jedoch Probleme befürchten, können Sie NO_INHERIT auf 0 setzen.
Änderungsgeschichte
===================
Änderungen von Version 3.0a auf 3.1:
Neu sind vor allem die automatische Behandlung von .BAT-Dateien und
die Unterstützung der I/O-Dateiumleitung. Die Suchreihenfolge für
Kommandos entspricht jetzt exakt der DOS-Reihenfolge, bis auf die
Bearbeitung interner Kommandos (es gibt keinen sicheren Weg für die
Erkennung, ob ein Kommando intern oder extern ist). Dateiumleitung
ist optional. Das Interface zu do_exec hat sich nicht geändert,
do_spawn benötigt drei neue Parameter wenn Redirection eingeschaltet
ist.
Eine Routine (checkpat.asm) die einen Pfad prüft und auflöst sowie in
seine Bestandteile aufteilt wurde hinzugefügt. Diese Routine führt
einige Prüfungen des Pfades und des Dateinamens durch und behandelt
Critical Errors (ungültiges Laufwerk, Laufwerk nicht bereit) ohne
Benutzereingriff. Die Routine wird zur Bearbeitung des
Programm-Dateinamens, des Kommandoprozessor-Dateinamens und des
temporären Dateipfades verwendet. Die Routine ist unabhängig von den
anderen EXEC/SPAWN-Funktionen, sie kann daher auch in anderen
Applikationen nützlich sein.
Einige neue Fehlercodes erlauben eine bessere Analyse von
Fehlerursachen.
Der Pfad der temporären Datei ist jetzt stets ein vollständiger Pfad.
Ein Wechsel von Laufwerk oder Pfad während der Auslagerung kann daher
jetzt nicht mehr zum Verlust der Auslagerungsdatei führen.
Die Prüfung auf Existenz einer Datei wurde in checkpat.asm verlagert,
und von der 'find first'-Funktion auf 'get file attributes'
umgestellt. Dies scheint geringfügig schneller und vermeidet
Compiler-Abhängigkeiten.
Das Programm GETLANG wurde korrigiert, die Hilfs-Meldungen werden
jetzt auf stderr ausgegeben.
Änderungen von Version 3.0 auf 3.0a:
Ein kleiner Fehler in EXEC.C wurde korrigiert: ein '<' fehlte in
einem deutschen Kommentar, sodaß bei GETLANG E ein großer Teil der
Datei verschluckt wurde.
Ein Problem (Fehler? Feature?) bei der Turbo C/Borland C "stat"
Funktion, die für Directories stets "read-only" liefern, verhinderte
die Benutzung der TEMP Directory beim Auslagern. Die Schreib-
Erlaubnis wird jetzt nicht mehr geprüft.
Die Präallozierung der Auslagerungsdatei, die mit Version 3.0
eingeführt wurde um sicherzustellen daß das Laufwerk den kompletten
Speicher fassen kann, führte zu starken Verzögerungen wenn die
Auslagerungsdatei auf einem Novell-Netzwerk Laufwerk lag. Um dieses
Problem zu umgehen wurden zwei neue Flags für den "method" Parameter
eingeführt:
NO_PREALLOC - Nie Präallozieren
CHECK_NET - Nicht Präallozieren wenn Datei auf Netzwerk
Wenn die Datei nicht präalloziert wird, wird das Laufwerk nicht auf
ausreichenden Platz geprüft. Die Alternative, der "get disk free
space" Aufruf, dauert im allgemeinen noch wesentlich länger als ein
Präallozieren. Dies ist allerdings kein großes Problem, die
Auslagerung liefert lediglich den Fehlercode 0x502 wenn der
Speicherplatz nicht ausreicht.
Änderungen für Version 3.0:
Dies ist die erste Version mit Deutscher Dokumentation. Falls Sie mit
früheren Versionen gearbeitet haben, können Sie die Änderungen in der
Englischen Beschreibung nachlesen - denn dann können Sie doch
Englisch, oder? :)